import { reqCheckAllCart, reqDeleteCart, reqFindCartList, reqInsertCart, reqMergeLocalCart, reqUpdateCartSku } from '@/api/cart'
import { getNewCartGoods } from '@/api/goods'
import { Stock } from '@/api/goods.types'
import { ResponseData } from '@/utils/request'
import { defineStore } from 'pinia'
import userStore from './user'
export interface CartItem {
  id: string;
  name: string;
  picture: string;
  skuId: string;
  price: string;
  nowPrice: string;
  attrsText: string;
  stock: number;
  isEffective: boolean;
  selected: boolean;
  count: number;
  [key: string]: any
}

const cartStore = defineStore({
  // 唯一标识
  id: 'cart',
  // 开启持久化存储
  persist: true,
  // 相当于 data
  state: () => {
    return {
      list: [] as CartItem[]
    }
  },
  // 相当于 computed
  getters: {
    // 已选择的有效商品列表
    selectedList (): CartItem[] {
      return this.effectiveList.filter(item => item.selected)
    },
    // 已选择的有效商品列表总件数
    selectedListTotal (): number {
      return this.selectedList.reduce((total, item) => total + item.count, 0)
    },
    // 已选择的有效商品列表总价格
    selectedListTotalPrice (): string {
      return this.selectedList.reduce((total, item) => total + (item.count * Number(item.nowPrice)), 0).toFixed(2)
    },
    // 计算全选：是否全部选中
    isAllEffectSelected (): boolean {
      return this.effectiveList.every(item => item.selected) && this.effectiveList.length !== 0
    },
    // 计算有效商品列表 isEffective = true  filter
    effectiveList (): CartItem[] {
      return this.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 有效商品总数量 把effctiveList中的每一项的count叠加起来
    effectiveTotal (): number {
      // 使用 reduce 快速实现
      return this.effectiveList.reduce((total, item) => total + item.count, 0)
    },
    // 总金额  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    effectiveTotalPrice (): string {
      return this.effectiveList.reduce((total, item) => total + (item.count * Number(item.nowPrice)), 0).toFixed(2)
    },
    isLogin (): boolean {
      const user = userStore()
      return !!user.profile.token
    }
  },
  // 相当于 methods
  actions: {
    // 合并本地购物车
    async mergeLocalCart () {
      const cartList = this.list.map(item => {
        return {
          skuId: item.skuId,
          selected: item.selected,
          count: item.count
        }
      })
      await reqMergeLocalCart(cartList)
    },
    // 全选
    async checkAll (selected: boolean) {
      if (this.isLogin) {
        // 情况1：已登录 - 调用接口
        const ids = this.effectiveList.map(v => v.skuId)
        await reqCheckAllCart({ selected, ids })
        // ✨乐观更新
      } else {
        this.list.forEach(item => {
          item.selected = selected
        })
      }
    },
    // 更新购物车商品信息
    async undateCartInfo (goods: Partial<CartItem>) {
      const goodsObj = this.list.find(item => item.skuId === goods.skuId)
      if (goodsObj) {
        for (const key in goods) {
          // 更新不为 null 的字段
          if (goods[key] !== null) {
            goodsObj[key] = goods[key]
          }
        }
      }
    },
    // 用于更新单个商品信息的
    async updateCartSingle (goods: Partial<CartItem>) {
      if (this.isLogin) {
        // 情况1：已登录 - 调用接口
        await reqUpdateCartSku(goods)
        // ✨乐观更新：客户端假设请求必然成功，因此不等待接口的返回，先行对视图进行更新。
        // 主动更新购物车列表
        // this.updateCartList()
      } else {
        this.undateCartInfo(goods)
      }
      return Promise.resolve('更新商品信息成功')
    },
    // 更新商品列表
    async updateCartList () {
      if (this.isLogin) {
        // 情况1：已登录 - 调用接口
        const { result } = await reqFindCartList()
        this.list = result
      } else {
        // 情况2：未登录 - 操作本地数据
        const arr: Promise<ResponseData<Stock>>[] = []
        this.list.forEach(item => {
          arr.push(getNewCartGoods(item.skuId))
        })
        Promise.all(arr).then((res) => {
          // res 数据结构 [返回结果1, 返回结果2, 返回结果2 ...]
          res.forEach((item, index) => {
            // console.log(33333, item, index)
            // 返回的每个商品信息都要更新
            const goods: Stock = {
              // skuId 用于查找商品
              skuId: this.list[index].skuId,
              // 待更新的信息
              ...item.result
            }
            this.undateCartInfo(goods)
          })
        })
      }
      return Promise.resolve('更新SKU信息成功')
    },
    //  删除购物车商品，根据 skuId 查找商品实现删除
    async deleteCart (skuId: string) {
      if (this.isLogin) {
        // 情况1：已登录 - 调用接口
        await reqDeleteCart([skuId])
        // 主动更新购物车列表
        this.updateCartList()
      } else {
        // 情况2：未登录 - 操作本地数据
        this.list = this.list.filter(item => item.skuId !== skuId)
      }
      return Promise.resolve('删除商品成功')
    },
    // 加入购物车逻辑
    async addCart (goods: CartItem) {
      // console.log('asyncInertCart', store.rootState.user.profile.token)
      if (this.isLogin) {
        // 情况1：已登录 - 调用接口
        await reqInsertCart(goods)
        // 更新购物车列表
        this.updateCartList()
      } else {
        // 情况2：未登录 - 操作本地数据
        const index = this.list.findIndex(item => item.skuId === goods.skuId)
        if (index === -1) {
          // 情况1：未添加过的商品(前追加)
          this.list = [goods, ...this.list]
        } else {
          // 情况2：已添加过的商品(数量累加)
          this.list[index].count += goods.count
        }
      }
      return Promise.resolve('添加购物车成功')
    }
  }
})

export default cartStore
